Strings e Datas

Aula 13.2, M2

Carolina Musso

Sala de Situação - UnB

Esta semana

Aula 12 - Unindo e transformando

Funções join(), pivot_longer/wider.

Aula 13 - Trabalhando com texto (strings) e datas

  • Vocês! aula 13.1 Edição com set_header_labels(), add_header_row(), set_caption() e font(). Entregar o .Rmd da tabela da aula com algumas modificações simples.

  • 13.2 Pacotes stringr e lubridate

Leituras para aprofundamento

Strings

Datas

Strings

Variavel: Caracteres

  • Nada mais do que um texto

    • Variáveis de texto são comuns
  • Costumam não estar padronizadas

  • E por isso costumam dar trabalho!!

  • “Riacho Fundo”, “riacho fundo I”, “riacho fundo 1” …

pacote strigR e tidyR

  • str_c

  • str_trim()

  • str_sub ()

  • str_detect

  • separate()

  • unite()

str_c

str_c("A", "aula", "de", "R")
[1] "AauladeR"
str_c("A", "aula", "de", "R", sep=" ")
[1] "A aula de R"
nome <- c("Jose", "João", "Maria")
sobrenome <- c("Silva", "Faria", "Souza")
str_c(nome, sobrenome, sep=" ", collapse=", ")
[1] "Jose Silva, João Faria, Maria Souza"

R base

paste("A", "aula", "de", "R")
[1] "A aula de R"
paste(nome, sobrenome, collapse = ", ")
[1] "Jose Silva, João Faria, Maria Souza"

Já vimos 2 funções aula passada

  • str_to_upper()
  • str_to_lower()
  • Também tem a:
  • str_to_title()
  • str_to_sentence()

str_trim()

  • Retira espaços no começo e no final
IDs <- c("Brasília  ", 
         "  Brasília",   
         "Brasília 
         ")  

str_trim(IDs, "both")
[1] "Brasília" "Brasília" "Brasília"
  • Parece útil?

str_sub()

  • extrair uma parte de interesse
str_sub("pneumonia", 1, 2)
[1] "pn"
str_sub("pneumonia", 6, -1)
[1] "onia"
  • Conseguem pensar em exemplos onde isso pode ser útil?
    • Não falamos disso ainda, mas as vezes uso para trabalhar com datas!

str_detect ()

  • Detectar padrões
string <- "A professora é legal"
str_detect(string,pattern = "é")
[1] TRUE
  • Vou mostrar uma coisa, e quero que pensem para que pode ser útil …
sum(str_detect(string,pattern = "é"))
[1] 1

str_replace

str_replace(string, pattern="legal", replacement="muito legal!")
[1] "A professora é muito legal!"
  • Se colocarmos na ordem, não precisamos explicitar o nome dos argumentos, lembram?
str_replace(string, "legal", "extremamente legal!")
[1] "A professora é extremamente legal!"

separate() {tidyR}

  • Separar valores de células que contém mais de uma informação
  case_ID                      sintomas   desfecho
1       1    icterícia, febre, calafrio Recuperado
2       2 calafrio, dores, dores fortes      Óbito
3       3                         febre      Óbito
4       4              vômito, diarréia Recuperado
5       5 sangramento da gengiva, febre Recuperado
6       6   pulso rapido, dor de cabeça Recuperado
df_split <- df %>% 
  separate( col=sintomas,
           into = c("sym_1", "sym_2", "sym_3"), 
           extra = "merge",
           sep=",")
df_split 
  case_ID                  sym_1          sym_2         sym_3   desfecho
1       1              icterícia          febre      calafrio Recuperado
2       2               calafrio          dores  dores fortes      Óbito
3       3                  febre           <NA>          <NA>      Óbito
4       4                 vômito       diarréia          <NA> Recuperado
5       5 sangramento da gengiva          febre          <NA> Recuperado
6       6           pulso rapido  dor de cabeça          <NA> Recuperado
  • repare que essa função já age no data frame todo sem a necessidade do mutate()

unite ()

df_split %>% 
  unite(
    col = "todos os sintomas", c("sym_1", "sym_2", "sym_3"), 
    sep = ", ", remove = TRUE, na.rm = TRUE                  
  )
  case_ID               todos os sintomas   desfecho
1       1    icterícia,  febre,  calafrio Recuperado
2       2 calafrio,  dores,  dores fortes      Óbito
3       3                           febre      Óbito
4       4               vômito,  diarréia Recuperado
5       5  sangramento da gengiva,  febre Recuperado
6       6    pulso rapido,  dor de cabeça Recuperado

E isso é só o começo …

Exemplos

Vigilância em saúde baseada em eventos e rumores

Piauí

Expressões Regulares

  • RegEx parea os íntimos

  • Vamos falar rapidamente sobre isso

Parâmetros das Regex

Âncoras

Parâmetros das Regex

Operadores

Exemplo no R

banana_vec <- c("banana", "bananas", "bananal", "abanar", "bananeira", "bandolim")

str_detect(banana_vec, "^ban")
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
str_detect(banana_vec, "a$")
[1]  TRUE FALSE FALSE FALSE  TRUE FALSE
str_extract_all(banana_vec, "^ban.*") %>%
  unlist() #transformar a lista em um vetor
[1] "banana"    "bananas"   "bananal"   "bananeira" "bandolim" 
str_replace(banana_vec, "^ban", "BAN") %>% unlist()
[1] "BANana"    "BANanas"   "BANanal"   "abanar"    "BANaneira" "BANdolim" 

Prática

datasus <- rio::import("https://d26692udehoye.cloudfront.net/SRAG/2019/INFLUD19.csv")

datasus %>% 
  select(OUT_ANTIV) %>% 
  filter(OUT_ANTIV!="") %>% 
  head(50)
        OUT_ANTIV
1         tamiflu
2        tamiflur
3         tamiflu
4         TAMIFLU
5         tamiflu
6         tamiflu
7         tamiflu
8  claritromicina
9     azitomicina
10   azitromicina
11        tamiflu
12 claritromicina
13        TAMIFLU
14       clavulin
15 claritromicina
16        TAMIFLU
17        tamiflu
18        tamiflu
19 claritromicina
20      aciclovir
21       tamiflur
22       tamiflur
23        TAMIFLU
24        TAMIFLU
25        tamiflu
26        TAMIFLU
27        TAMIFLU
28 claritromicina
29        TAMIFLU
30        tamiflu
31        tamiflu
32   TAMIFLU 75MG
33        TAMIFLU
34        tamiflu
35        TAMIFLU
36 TANIFLUR 75 MG
37       tamiflur
38        TAMIFLU
39        tamiflu
40        tamiflu
41        tamiflu
42       tamiflur
43        tamiflu
44        tamiflu
45   azitromicina
46        TAMIFLU
47        TAMIFLU
48 CLARITROMICINA
49   AZITROMICINA
50        tamiflu

Prática

datasus %>% 
  mutate(OUT_ANTIV=str_to_lower(OUT_ANTIV)) %>% 
  filter(str_detect(OUT_ANTIV, "flu"))%>% 
  select(OUT_ANTIV) %>% 
  head(50)
        OUT_ANTIV
1         tamiflu
2        tamiflur
3         tamiflu
4         tamiflu
5         tamiflu
6         tamiflu
7         tamiflu
8         tamiflu
9         tamiflu
10        tamiflu
11        tamiflu
12        tamiflu
13       tamiflur
14       tamiflur
15        tamiflu
16        tamiflu
17        tamiflu
18        tamiflu
19        tamiflu
20        tamiflu
21        tamiflu
22        tamiflu
23   tamiflu 75mg
24        tamiflu
25        tamiflu
26        tamiflu
27 taniflur 75 mg
28       tamiflur
29        tamiflu
30        tamiflu
31        tamiflu
32        tamiflu
33       tamiflur
34        tamiflu
35        tamiflu
36        tamiflu
37        tamiflu
38        tamiflu
39        tamiflu
40        tamiflu
41        tamiflu
42        tamiflu
43        tamiflu
44        tamiflu
45        tamiflu
46        tamiflu
47       tamiflur
48        tamiflu
49        tamiflu
50        tamiflu

Datas

Agora:

  • Trabalhando com datas

    • Geralmente é muito chato!
  • Incompatibilidade de formatos: d/m/a ; a-m-d

  • É caracter ou numérico?

    • Nenhum dos dois: é do tipo Date

Como o R reconhece a data?

Sys.Date()
[1] "2023-10-25"
Sys.time()
[1] "2023-10-25 13:34:21 -03"

VOCÊ SÓ CONSEGUE FAZER CONTAS DE INTERVALO DE TEMPO NESSE FORMATO

  • Ou seja, se não estiver, você tem que transformar para esse formato.

  • Ao apresentar em um gráfico ou tabela: pode formatar, mas a partir daí não é mais uma data para o R

Pacote lubridate

  • Está agora no tidyverse!

  • A intenção é sempre pegar uma data que está no “nosso formato”.

  • Ver o formato que ela está.

  • “Avisar” pro R o formato que ela está.

  • Para ele conseguir colocar no formato que ele consiga entender como uma data

library(tidyverse)
hoje <- "17/03/2022"
lubridate::dmy(hoje)
[1] "2022-03-17"

Ele é muito bom em adivinhar coisas!

  • Consegue saber as datas a partir de diferentes escritas!
hoje <- "17032022"
dmy(hoje)
[1] "2022-03-17"
hoje <- "17-03-2022"
dmy(hoje)
[1] "2022-03-17"
hoje <- "1703     22"
dmy(hoje)
[1] "2022-03-17"

Com o R base

hoje <- "17/02/2022"
class(hoje)
[1] "character"
  • Para transformar, avise o formato em que ele estava!
hoje <- as.Date(hoje, format="%d/%m/%Y") 

class(hoje)
[1] "Date"
hoje
[1] "2022-02-17"

%d = dia

%m= mês número ; %B= mês nome ; %b= nome abreviado

%y = ano com 2 dígitod (ex. 89 ; %Y = ano com 4 dígitos (ex. 1989)

%A = Dia da semana (Segunda, Terça, etc.)

%U = Semana (01-53)

As vezes é mais difícil

  • Há vários outros problemas que podem acontecer…

  • Mas o importante é: tem que ter

hoje <- Sys.Date()
class(hoje)
[1] "Date"
  • Assim contigo fazer contas!

Contas com datas

hoje <- Sys.Date()

hoje
[1] "2023-10-25"
  • Somar dias
hoje + days(3)
[1] "2023-10-28"

Ou simplesmente:

hoje + 3
[1] "2023-10-28"
  • Somar meses e anos
hoje + months(1)
[1] "2023-11-25"
hoje - years(20)
[1] "2003-10-25"

Intervalo de tempo

  • Algumas formas
diferenca <- hoje - ymd("2020-02-20")
diferenca
Time difference of 1343 days
  • Depois posso transofrmar para numérico
diferenca <- as.numeric(diferenca)
diferenca
[1] 1343
  • Função difftime()
passado <- hoje -  14
passado
[1] "2023-10-11"
diferenca <- difftime(hoje,passado, units = "weeks")

diferenca
Time difference of 2 weeks

Mas a data assim fica feio!

  • Não estamos costumados a mostrar a data nesse formato de YYY-mm-dd

  • DEPOIS de fazer as contas, ordenações que eu quiser, eu posso escolher apresentar nas tabelas, gráficos, texto, de outra forma… para isso, existe a funçao format.

  • É a idéia do as.Date, ao contrário…

data_bonita <- format(Sys.Date(), format = "%d %B %Y")
data_bonita
[1] "25 October 2023"
class(data_bonita)
[1] "character"

Semanas epidemiológicas

  • Tem uma função que calcula as semanas epidemiológicas epiweek().

  • Ela é bem “esperta”

  • consegue extrair de um objeto de data

epiweek(Sys.Date())
[1] 43
  • Mas também reconhecer datas em diferentes formatos
semana <- epiweek("22/03/23")
semana
[1] 12
class(semana)
[1] "numeric"

ggplot e datas

Exemplos em: Datanovia

scale_x_date(date_labels = "%b/%d")
  • Veremos mais manipulações dos eixos no próximo módulo

Agora faça você mesmo!

Até a próxima aula!